# -*- coding: utf-8 -*-
"""
Author: chen xi
Date: 2025/6/27 上午10:07
File: test.py

功能说明：
这是一个定时任务脚本，用于定时处理串口日志（如 COM4）中指定时间段内的日志信息，
过滤后打包上传到服务器，并记录处理结果。
"""

import json
import os
import time
from datetime import datetime, timedelta
import schedule
from handle_exceptions import catch_exception
from log_reader import LogFilter
from logging_utils import Logger
import threading


@catch_exception(expected_exception=Exception, default_value=0)
def process_port_logs(main_config: dict, run_config: dict):
    """
    处理指定串口的日志过滤、打包和上传操作

    :param main_config: 主配置字典，包含串口设备相关配置（如 port、log_dir 等）
    :param run_config: 运行时配置，包含全局设置（如 interval 等）
    :return: 匹配到的日志字典（或默认值 0）
    """

    # 上传服务器地址
    server_url = run_config.get("upload_url")

    # 初始化 LogFilter，传入主配置（包含串口、日志路径等）
    log_filter = LogFilter(main_config)

    # 获取当前处理的时间范围
    start_time = time_dict["start_time"]
    end_time = time_dict["end_time"]

    # 构造输出 ZIP 文件名，格式为：filtered_log_COM4_202507181000.zip
    zip_filename = f"./logs/filtered_log_{main_config.get('port')}_{start_time.strftime('%Y%m%d%H%M')}.zip"

    # 构造上传配置，包含服务器地址
    upload_config = {
        'server_url': server_url
    }

    # 执行日志过滤并上传
    matched_logs, result = log_filter.filter_by_time_range(
        start_time=start_time,
        end_time=end_time,
        output_zip=zip_filename,
        upload_config=upload_config
    )

    # 可选：打印匹配结果
    for key, logs in matched_logs.items():
        Logger.info(f"\n【{key}】({len(logs)}条)")
        for log in logs:
            Logger.info(log)

    return result  # 返回上传结果（如 download_url）


if __name__ == "__main__":
    """
    主程序入口，负责加载配置、初始化定时任务、启动日志处理流程
    """

    # 配置文件路径
    MAIN_CONFIG_PATH = os.path.join("..", "config", "main_config.json")  # 主配置文件路径（设备相关）
    RUN_CONFIG_PATH = os.path.join("..", "config", "run_config.json")    # 运行配置文件路径（全局参数）

    # 读取主配置文件（包含多个串口设备的配置）
    with open(MAIN_CONFIG_PATH, "r", encoding="utf-8") as f:
        main_data = json.load(f)

    # 读取运行配置文件（包含运行时参数，如定时任务间隔）
    with open(RUN_CONFIG_PATH, "r", encoding="utf-8") as f:
        run_data = json.load(f)

    # 获取定时任务执行间隔（单位：分钟）
    interval = int(run_data.get("interval"))

    # 初始化时间字典，表示当前处理的时间段
    time_dict = {
        "start_time": datetime.now() - timedelta(minutes=interval),  # 上一周期开始时间
        "end_time": datetime.now()                                   # 上一周期结束时间
    }

    # 定时任务函数：用于启动日志处理线程
    def job():
        """
        定时任务入口函数，用于启动一个新的线程执行实际任务
        """
        thread = threading.Thread(target=run_job)  # 创建线程
        thread.daemon = True  # 设置为守护线程，主线程退出时自动结束
        thread.start()        # 启动线程

    def run_job():
        """
        实际执行日志处理的函数，遍历所有启用的串口配置并处理日志
        """
        for config in main_data:
            try:
                # 如果设备未启用，则跳过
                if not config.get("enabled"):
                    continue

                # 调用日志处理函数
                process_port_logs(config, run_data)

            except Exception as e:
                # 捕获并记录异常信息
                Logger.error(f"处理串口日志出错：{config}，错误：{e}")

        # 更新时间范围：向后推进一个 interval
        time_dict["start_time"] = time_dict["start_time"] + timedelta(minutes=interval)
        time_dict["end_time"] = time_dict["end_time"] + timedelta(minutes=interval)

        # 打印更新后的时间范围
        Logger.info(time_dict)

    # 首次立即执行一次任务
    job()

    # 设置定时任务：每 interval 分钟执行一次 job 函数
    schedule.every(interval).minutes.do(job)

    # 日志输出：提示定时器已启动
    Logger.info("定时器已启动，等待下一次定时任务执行...")

    # 主循环：持续检查并运行待执行的定时任务
    while True:
        schedule.run_pending()
        time.sleep(1)  # 避免 CPU 占用过高